# coding=utf-8
'''
Created on 2020-4-7
Rewrite on 2021-5-20
@author: Yoga
@author: Kuan

这部分内容主要是对js数据进行分词、计算文本长度、词长度等

python中zip()与zip(*)的用法解析：
https://blog.csdn.net/ezio23/article/details/81414092
'''
import platform

import pkg_resources
import pandas as pd
from matplotlib import pyplot as plt
import jieba
import numpy as np
import re

from src.junshi.classify.preprocess_data import do_segment

if platform.system().lower() == 'windows':
    DATA_PATH = 'E:/jsnews_extra/data/'
else:
    DATA_PATH = '/home/lirunkuan/class4_and_background2/jsnews_extra/data/'

STOPWORDS_SET = set()  # 停用词集合
STOPWORDS_FILENAME = 'zh_data/stopwords.txt'  # 停用词文件名


# 保留文本中文、数字、英文、短横线
def clear_text(text):
    p = re.compile(r"[^\u4e00-\u9fa5^0-9^a-z^A-Z\-、，。！？：；（）《》【】,!\?:;[\]()]")  # 匹配不是中文、数字、字母、短横线的部分字符
    return p.sub('', text)  # 将text中匹配到的字符替换成空字符


def clear_texts(df_content):
    clear_content_list = []
    for i, content in enumerate(df_content):
        clear_content_list.append(clear_text(content))
    return clear_content_list


if __name__ == '__main__':

    '''
    经过check.py得到js_news/bzpt_export/js_pd_ysyd_20201217.txt类似文件
    运行本main函数，得到一个清洗过的数据集
    清洗过的数据集和labeled_data/20201217/js_pd_seg_merge.txt进行合并
    合并操作前去掉一个表头
    合并操作用命令行 cat 完成，加uniq去重
    得到新merge文件送入prepare_jsnews_training_data生成数据集
    注意修改保存路径
    '''
    # 加载数据
    # df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_20200927.txt', encoding='UTF-8', sep='\t', header=0,
    #                      index_col=False)
    # df_data = pd.read_csv(DATA_PATH + 'js_news/labeled_data/auto_tagged/20200701/tmp/20201013/'
    #                                   'js_pd_20201013_off_line_labeled_1.txt', encoding='UTF-8', sep='\t', header=0,
    #                       index_col=False)
    # df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_azerbaijan_20201101.txt', encoding='UTF-8', sep='\t', header=0,
    #                       index_col=False)
    # df_data = pd.read_csv(DATA_PATH + 'js_news/labeled_data/auto_tagged/20200701/tmp/20201108/'
    #                                   'js_pd_20201108_off_line_labeled.txt', encoding='UTF-8', sep='\t', header=0,
    #                       index_col=False)
    # df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_bushu_20201111.txt', encoding='UTF-8', sep='\t', header=0,
    #                       index_col=False)
    # df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_yanxi_20201111.txt', encoding='UTF-8', sep='\t',
    #                       header=0, index_col=False)
    df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_ysyd_20201217.txt', encoding='UTF-8', sep='\t',
                          header=0, index_col=False)
    input('!!!! residual code still')
    df_data = pd.read_csv(DATA_PATH + 'js_news/bzpt_export/js_pd_ysyd_20210515.txt', encoding='UTF-8', sep='\t',
                          header=0, index_col=False)                          
    df_data = df_data.dropna()  # 过滤含有NaN的数据
    print(df_data.head())
    print(df_data.shape[0])  # 112293

    # 清洗文本
    clear_content_list = clear_texts(df_data['text'])
    df_data.pop('text')
    df_data['clear_content'] = clear_content_list
    print(df_data.head())
    print(df_data.shape)  # (1319, 2)

    # 分词
    df_data['content_seg'] = do_segment(df_data['clear_content'], use_userdict=True)
    df_data.replace(to_replace=r'^\s*$', value=np.nan, regex=True, inplace=True)
    df_data = df_data.dropna()  # 过滤含有NaN的数据
    print(df_data.head())  #
    print(df_data.shape)

    df_text_len = pd.DataFrame({'content_len': [len(text) for text in df_data['clear_content']]})
    df_text_len.content_len.hist(bins=30)
    plt.show()

    df_token_num = pd.DataFrame({'token_num': [len(text) for text in df_data['content_seg']]})
    df_token_num.token_num.hist(bins=30)
    plt.show()

    # df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_20200927.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    # df_data.to_csv(DATA_PATH + 'js_news/off_line_export/preprocessed/js_pd_seg_20201013.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    # df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_azerbaijan_20201101.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    # df_data.to_csv(DATA_PATH + 'js_news/off_line_export/preprocessed/js_pd_seg_20201108.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    # df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_bushu_20201111.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    # df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_yanxi_20201111.txt', sep='\t', index=False,
    #                encoding='UTF-8')
    df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_ysyd_20201217.txt', sep='\t', index=False,
                   encoding='UTF-8')
    input('!!!! residual code still')
    df_data.to_csv(DATA_PATH + 'js_news/bzpt_export/preprocessed/js_pd_seg_ysyd_20200515.txt', sep='\t', index=False,
                   encoding='UTF-8')
    # 合并标注数据集：
    # ~mkdir /home/lirunkuan/class4_and_background2/jsnews_extra/data/js_news/labeled_data/20200515
    # ~cd /home/lirunkuan/class4_and_background2/jsnews_extra/data/js_news/labeled_data/20200515
    # ～cat ../../bzpt_export/preprocessed/js_pd_seg_ysyd_20210515.txt ../20201217/js_pd_seg_merge.txt |uniq > js_pd_seq_merge.txt
    # 然后手动删除表头

'''
labeled clear_content   content_seg
0       原标题：日本海上自卫队迎来首批女性潜艇船员，共5人当地时间29日，原本仅有男性船员的日本海上自卫队潜艇部队首次迎来女性船员。日本共同社30日报道称，29日，5名女性在广岛县吴市的海自吴基地结束训练，被授予证明可登上潜艇的徽章海豚标志。据悉，潜艇上设置了女
性专用区域，女性可在执行任务时使用。这5名女性队员年龄在20岁至50岁之间，她们今年6月在训练用潜艇满潮号上开始实习训练，直至29日。在徽章授予仪式上，现年23岁的三等海曹（相当于海军下士）田口梦花代表5人发表讲话称：希望可为女性的活跃与发展贡献微薄力量。尽管《男>女雇用机会均等法》早在1986年便实施，但在潜艇上安排女性自卫官仍受到限制，直到2018年，海自以现有潜艇可以完善确保女性隐私等为由废除了限制。据海自吴地方总监部称，眼下约42万名日本海上自卫官中，女性约有3000人。        标题 日本 海上 自卫队 迎来 首批 女性 潜艇 船员 时间 原本 男性 船员 日本 海上 自卫队 潜艇部队 首次 迎来 女性 船员 日本共同社 报道 女性 广岛 吴市 海自 基地 结束 训练 授予 证明 登上 潜艇 徽章 海豚 标志 潜艇 设置 女性 专用 区域 女性 执行 女性 队员 年龄 之间 训练 潜艇 满潮 实习 训练 直至 徽章 授予 仪
式 现年 三等 海曹 相当于 海军 下士 田口 梦花 代表 发表 讲话 希望 女性 活跃 发展 贡献 微薄 力量 男女 雇用 机会均等 1986 实施 潜艇 安排 女性 自卫 受到限制 2018 海自以 现有 潜艇 完善 确保 女性 隐私 废除 据海自 地方 总监部 眼下 万名 日本 海上 自卫 官中 女性 3000
6       最近，特立独行的美国总统特朗普又虚张声势了一把：美国记者鲍勃伍德沃德的新书《愤怒》称，特朗普在接受采访时提到一种神秘武器，他说：我制造了核武器，我制造了一个武器系统，这是这个国家以前从来没有过的。有些系统没有人知道，包括你。我们有一些系统，没有人
知道。而且坦率地说，我想我最好保持这种方式。卡内基国际和平基金会核专家阿克顿认为，特朗普指的可能是W76-2核弹头。该弹头装备在美国海军弹道导弹潜艇携带的三叉戟IID5导弹上，部署时机与特朗普接受采访的时间很匹配。那么，W76-2弹头究竟有什么能耐？特朗普为何对它念念
不忘？图说：W76-2核弹头。GJ图核弹技术含量高突防打击能力强W76-2是在三叉戟IID5型洲际导弹所携带W76-1核弹头基础上研发而来的低当量热核弹头，美国官方没有公布其爆炸当量，美国科学家联盟推测只有5000吨TNT，相当于美国投到广岛的小男孩原子弹的三分之一。W76-2爆炸所产>生的火球直径仅150米，冲击波、早期核辐射以及光辐射只能影响周边2公里区域。虽然威力相对不大，W76-2却有三大优势：首先是技术含量高。因为它是热核弹头，也就是俗称的氢弹。通常情况下，氢弹的爆炸当量做大容易，做小很难。所以，低当量的W76-2热核弹头出现，表明美国在核
弹技术上又有了重大进步。其次是打
'''

'''
label   clear_content   content_seg
0       3月23日报道外媒称，菲律宾空军将从日本采购一批先进防空雷达站，这是日本首次向另一个亚洲国家大批量出售昂贵军事设备。据俄罗斯卫星通讯社网站3月20日报道，菲律宾媒体证实，菲律宾空军签署协议，从日本购买一批防空雷达站。俄军事专家瓦西里卡申介绍称，这是日本
首次向另一个亚洲国家大批量出售昂贵军事设备。此前，日本军工出口主要与美国各类项目研发和配件供应相关。同时，日本也为亚洲一些国家提供海岸警备相关设备。2014年，日本武器出口限制被解除。但直到不久前，情况并未发生显著变化。2010年代中期，日本三菱重工和川崎重工财
团试图参与澳大利亚海军常规动力潜艇建造竞标，但在2016年输给了法国海军造船局集团。报道认为，新合同意义重大。根据合同，菲律宾将获得三套现代化的JFPS-3ME雷达站和一套移动式JNPS-P14ME雷达站。JFPS-3ME是有源相控阵雷达，现代化程度较高，也比较昂贵，可提高菲律宾对本
国空域的监控能力。资料图片：日本生产的JFPS-3ME雷达系统有
'''